"""
AI服务工厂模块
负责创建和管理不同类型的AI服务实例
"""

import logging
from .base_service import BaseAIService
from .ocr_service import VolcanoOCRService
from .cloud_services import DoubaoService
from .local_services import LMStudioService
from .ollama_service import OllamaService
from .hybrid_service import HybridAIService

logger = logging.getLogger(__name__)

def get_ai_service(config: dict) -> BaseAIService:
    """
    AI服务工厂函数 (Factory function for AI services).
    根据配置选择并实例化一个AI服务 (Selects and instantiates an AI service based on config).
    """
    active_model = config.get('active_model', 'lmstudio')
    service_name = config.get('app_settings', {}).get('active_ai_service', 'hybrid')

    logger.info(f"[AI服务初始化] 激活模型: {active_model}, 服务模式: {service_name}")

    # 如果是hybrid模式，根据active_model选择具体服务
    if service_name == 'hybrid':
        return HybridAIService(config)
    # 直接模式：根据active_model选择具体服务
    elif active_model == 'lmstudio':
        logger.info("[AI服务初始化] 正在激活 LMStudio 本地服务")
        return LMStudioService(config.get('lmstudio', {}))
    elif active_model == 'doubao':
        logger.info("[AI服务初始化] 正在激活 Doubao 云服务")
        return DoubaoService(config.get('doubao', {}))
    elif active_model == 'ollama':
        logger.info("[AI服务初始化] 正在激活 Ollama AI 服务")
        return OllamaService(config.get('ollama', {}))
    elif active_model == 'volcano_ocr':
        logger.info("[AI服务初始化] 正在激活 Volcano OCR 服务")
        return VolcanoOCRService(config.get('volcengine', {}))
    else:
        logger.warning(f"[AI服务初始化] 未知模型类型: {active_model}, 默认使用 LMStudio")
        return LMStudioService(config.get('lmstudio', {}))

def list_available_services() -> dict:
    """
    列出所有可用的AI服务类型

    :return: 服务类型字典
    """
    return {
        'ocr': {
            'name': 'VolcanoOCR',
            'description': '火山引擎OCR文字识别服务',
            'provider': 'volcano_engine'
        },
        'cloud': {
            'name': 'Doubao',
            'description': '豆包云端AI模型服务',
            'provider': 'doubao'
        },
        'local': {
            'name': 'LMStudio',
            'description': 'LMStudio本地AI模型服务',
            'provider': 'lmstudio'
        },
        'ollama': {
            'name': 'Ollama',
            'description': 'Ollama本地或远程AI模型服务',
            'provider': 'ollama'
        },
        'hybrid': {
            'name': 'HybridAI',
            'description': '智能混合AI服务调度',
            'provider': 'intelligent_routing'
        }
    }

def validate_service_config(config: dict) -> bool:
    """
    验证AI服务配置是否有效

    :param config: 服务配置字典
    :return: 配置是否有效
    """
    active_model = config.get('active_model', 'lmstudio')
    service_name = config.get('app_settings', {}).get('active_ai_service', 'hybrid')

    # 验证hybrid模式配置
    if service_name == 'hybrid':
        if active_model == 'lmstudio':
            lm_config = config.get('lmstudio', {})
            if not lm_config.get('api_url'):
                logger.error("[配置验证] LMStudio API URL未配置")
                return False
        elif active_model == 'doubao':
            doubao_config = config.get('doubao', {})
            if not doubao_config.get('api_key') or not doubao_config.get('api_url'):
                logger.error("[配置验证] Doubao API配置不完整")
                return False
        elif active_model == 'ollama':
            ollama_config = config.get('ollama', {})
            if not ollama_config.get('api_url'):
                logger.error("[配置验证] Ollama API URL未配置")
                return False
        elif active_model == 'volcano_ocr':
            volc_config = config.get('volcengine', {})
            if not volc_config.get('ak') or not volc_config.get('sk'):
                logger.error("[配置验证] Volcano配置不完整")
                return False

    # 验证直接模式配置
    elif active_model == 'lmstudio':
        lm_config = config.get('lmstudio', {})
        if not lm_config.get('api_url'):
            logger.error("[配置验证] LMStudio API URL未配置")
            return False
    elif active_model == 'doubao':
        doubao_config = config.get('doubao', {})
        if not doubao_config.get('api_key') or not doubao_config.get('api_url'):
            logger.error("[配置验证] Doubao API配置不完整")
            return False
    elif active_model == 'ollama':
        ollama_config = config.get('ollama', {})
        if not ollama_config.get('api_url'):
            logger.error("[配置验证] Ollama API URL未配置")
            return False
    elif active_model == 'volcano_ocr':
        volc_config = config.get('volcengine', {})
        if not volc_config.get('ak') or not volc_config.get('sk'):
            logger.error("[配置验证] Volcano配置不完整")
            return False

    logger.info("[配置验证] AI服务配置验证通过")
    return True
